#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <signal.h>

#include "global.h"
#include "constantes.h"
#include "listas.h"
#include "sockets.h"
#include "configuracion.h"
#include "NIPC.h"


void get_sectores(int *iSector,struct DiscoConocido * pDiscoAutilizar, char* sDescriptorID_dePedido , char * sSocket_dePedido);
char* Generar_Desc_ID ( void );
void imprimirLista(struct ListaIDdescriptors *ptrActual);
void get_sectores(int *iSector,struct DiscoConocido * pDiscoAutilizar, char* sDescriptorID_dePedido , char * sSocket_dePedido);
struct DiscoConocido * asignarADisco(struct DiscoConocido *pDisco,char *numeroPedido);
 
int main() {
 
   int *pSector1;
   struct DiscoConocido * pAuxDisco;
   struct DiscoConocido * pDiscoAsignado;
   int cont=3000;
   char *numeroPedido;
 
   while(1){

      sleep(10);
      if( (Estado == FUERA_DE_SERVICIO)  )
            printf("Aun no se pueden atender pedidos \n ");
      else
      {
         pSector1 = malloc(sizeof(int));
         *pSector1 = cont + 4;
         pAuxDisco = ListaDiscos;
         pDiscoAsignado=asignarADisco(pAuxDisco,numeroPedido);
         imprimirLista(pDiscoAsignado->ListaDeIDPedidos);
         get_sectores(pSector1,pDiscoAsignado,numeroPedido,"33");
         printf("Pedido get \n");         
         break;
      }  
      
      cont=cont+1;
   }

}


struct DiscoConocido * asignarADisco(struct DiscoConocido *pDisco,char *numeroPedido){

   struct DiscoConocido * ptrActual;
   struct DiscoConocido * ptrAnt;
   struct DiscoConocido * ptrelegido;
   /*
   numeroPedido=Generar_Desc_ID;
   ptrAnt=NULL;
   ptrActual=pDisco;
   
   while (ptrActual != NULL) {  
     ptrAnt=ptrActual;
     ptrActual = ptrActual->Sgt;
     if ((longitud(ptrActual)<longitud(ptrAnt))&&(ptrActual->Estado==LISTO))
         ptrelegido=ptrActual;     
   }
   
   CambiaPosicionDelNodo(&ptrelegido);
   return ptrelegido;
	*/
}

char* Generar_Desc_ID ( void )
{
	static char ID [ 16 ] = "\0"; 
	unsigned int i;
	time_t tiempo;
	
	tiempo = time ( NULL );
	srand ((unsigned int) tiempo );
	for( i = 0 ; i < 16 ; i++ )
	{
		if((rand ( ) % 2) == 0)
		{
			ID [ i ] = 97 + rand ( ) % 25;
		}
		else
		{
			ID [ i ] = 48 + rand ( ) % 10;
		}
	}
   
	return ID;
}


void imprimirLista(struct ListaIDdescriptors *ptrActual){

   if(ptrActual==NULL) 
      printf("Lista vacia\n");
   else{ 
      printf("La lista es: \n");
      while(ptrActual!=NULL){
         printf("%c->",ptrActual->sDescriptorID_delPedido);
         ptrActual=ptrActual->Sgt;
        
      }
      printf("NULL \n");   
   }
}  



void get_sectores(int *iSector,struct DiscoConocido * pDiscoAutilizar, char* sDescriptorID_dePedido , char * sSocket_dePedido)
 {
   struct DiscoConocido * pDisco;
   char sDescriptorID[16];
   char *sAux;
   InfoIPC rInfoIPC;
	
   
   pDisco = pDiscoAutilizar;

   generarStructIPC("nada",GET_SECTORES,&rInfoIPC);   
   rInfoIPC.payLoadLength = strlen(rInfoIPC.descriptorID) +1;
	rInfoIPC.payload = (char*) malloc(rInfoIPC.payLoadLength);
	memset(rInfoIPC.payload,'\0',rInfoIPC.payLoadLength);
	memcpy(rInfoIPC.payload, rInfoIPC.descriptorID,rInfoIPC.payLoadLength); 
   enviarIPC(pDisco->iSocketArrayParaHDA,&rInfoIPC);
   
   rInfoIPC.payLoadLength = strlen(sSocket_dePedido) +1;
	rInfoIPC.payload = (char*) malloc(rInfoIPC.payLoadLength);
	memset(rInfoIPC.payload,'\0',rInfoIPC.payLoadLength);
	memcpy(rInfoIPC.payload,sSocket_dePedido,rInfoIPC.payLoadLength); 
   enviarIPC(pDisco->iSocketArrayParaHDA,&rInfoIPC);
  
   if(iSector == NULL)
      sAux = NULL;
   else
   {
      sAux = malloc(20);
      intacad(*iSector, sAux);
   }
   
   rInfoIPC.payLoadLength = strlen(sAux) +1;
	rInfoIPC.payload = (char*) malloc(rInfoIPC.payLoadLength);
	memset(rInfoIPC.payload,'\0',rInfoIPC.payLoadLength);
	memcpy(rInfoIPC.payload, sAux,rInfoIPC.payLoadLength); 
   enviarIPC(pDisco->iSocketArrayParaHDA,&rInfoIPC);
   
}